/*
 * Menu.h
 *
 * Copyright (c) 2009-2011 [BRN] aka. SWW13.
 *
 * This file is part of [BRN]Lib.
 *
 * [BRN]Lib is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * [BRN]Lib is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with [BRN]Lib.  If not, see <http ://www.gnu.org/licenses/>.
 */

#if !defined BRNlib_NoD3D

#pragma once
#include "..\D3D Version.h"
#include "..\..\Core\Mouse.h"
#include "..\Core\Color.h"
#include "..\Core\Draw.h"
#include "..\Core\FontManager.h"
#include "..\..\Tools\Misc.h"
#include <vector>

namespace BRNlib
{
	namespace D3D
	{
		namespace GUI
		{
			#define EndGroup TreeEnd

			class Menu
			{
			public:
					struct Item
					{
						enum ItemType
						{
							Hack,
							OutPut,
							Group,
							Space
						}Type;
						enum ValueType
						{
							Bool,
							Int,
							Float,
							String,
							Text
						}VType;
						union _Value
						{
							bool Bool;
							int Int;
							float Float;
							char *String;
						}Value;

						char *Name;
						char **OptionNames;
						
						int TreeLevel;
						int MaxValue;

						Item(char *Name, int TreeLevel, ValueType VType, int MaxValue, ItemType Type, char **OptionNames = NULL);
						Item(char *Name, _Value Value, int TreeLevel, ValueType VType, int MaxValue, ItemType Typ, char **OptionNames = NULL);

						bool isActive();
						
						void Deactivate();
						void Decrease();
						void Increase();
					};

			protected:
					D3DXDevice *pDevice;
					BRNlib::D3D::Core::FontManager *pFont;
					BRNlib::Core::Mouse *pMouse;
					
					RECT Space;
					D3DCOLOR c_Text, c_OffText, c_TextBorder, c_SelectedText, c_OutPut, c_Group, c_Heading, c_TreeLines, c_Border, c_BackGround;

					char *Title;
					std::vector<Item*> ItemList;
					int TreeLevel;
					int Selected;

					POINT Pos;
					POINT Size;


				public:
					Menu(D3DXDevice *pD3Ddev, BRNlib::D3D::Core::FontManager *pFont, char *Title, int x = 15, int y = 25);

					void SetSpace(int Left, int Top, int Right, int Bottom);
					void SetColor(D3DCOLOR c_Text, D3DCOLOR c_OffText, D3DCOLOR c_TextBorder, D3DCOLOR c_SelectedText, D3DCOLOR c_OutPut,
									D3DCOLOR c_Group, D3DCOLOR c_Heading, D3DCOLOR c_TreeLines, D3DCOLOR c_Border, D3DCOLOR c_BackGround);
					RECT GetHeader();
					RECT GetHeaderRect();

					void AddItem(char *Name, Item::ValueType VType = Item::Bool, int MaxValue = 1);
					void AddItem(char *Name, char *OptionNames, int MaxValue = 1, int Value = 0);
					void AddOutPut(char *Name, Item::ValueType VType = Item::Int);
					void AddGroup(char *Name);
					void AddSpace();

					void TreeStart();
					void TreeEnd();

					void SetValue(char *Name, Item::_Value Value, int Num = 1);
					void SetValue(char *Name, bool Value, int Num = 1);
					void SetValue(char *Name, int Value, int Num = 1);
					void SetValue(char *Name, float Value, int Num = 1);
					void SetValue(char *Name, char *Value, int Num = 1);
					
					Item::_Value GetHackState(char *Name, int Num = 1);
					void PanicFunc();

					void Draw(int Alpha = 0, bool BorderedText = true, bool TreeLines = true);

				protected:
					void Keyboard();
					int Mouse();
					bool IsVisible(int ItemIndex);
					bool IsGroup(int ItemIndex);
					bool HasMoreChildren(int ItemIndex, int TreeLevel);
			};
		}
	}
}

#endif